package com.mb;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import com.facade.AssociadoFacade;
import com.facade.TelefoneDoAssociadoFacade;
import com.facade.TelefoneFacade;
import com.model.Associado;
import com.model.DependenteDoAssociado;
import com.model.EnderecoDoAssociado;
import com.model.Person;
import com.model.Telefone;
import com.model.TelefoneDoAssociado;
import com.model.enuns.UF;
import com.sun.faces.context.flash.ELFlash;

@ViewScoped
@ManagedBean
public class AssociadoMB extends AbstractMB implements Serializable {

    private static final long serialVersionUID = 1L;
    private Associado associado;
    private Associado associadoTemp;
    private List<Associado> associados;
    private AssociadoFacade facade;
    private TelefoneMB telefoneMB = new TelefoneMB();

    public AssociadoFacade getFacade() {
        if (facade == null) {
            facade = new AssociadoFacade();
        }

        return facade;
    }

    public Associado getAssociado() {
        if (associado == null) {
            associado = (Associado) ELFlash.getFlash().get("associado");
            if (associado == null) {
                associado = new Associado();
            }
        }
        if (associado.getTelefoneDoAssociados() == null) {
            associado.setTelefoneDoAssociados(new ArrayList<TelefoneDoAssociado>());
        }
        if (associado.getEnderecoDoAssociados() == null) {
            associado.setEnderecoDoAssociados(new ArrayList<EnderecoDoAssociado>());
        }
        if (associado.getDependenteDoAssociados() == null) {
            associado.setDependenteDoAssociados(new ArrayList<DependenteDoAssociado>());
        }

        return associado;
    }

    public void setAssociado(Associado associado) {
        this.associado = associado;
    }

    public String persiste() {
        if (associado.getId() == 0) {
            return create();
        } else {
            return update();
        }
    }

    public String create() {
        try {
            getFacade().createAssociado(associado);
            persisteTelefones();
//			closeDialog();
            displayInfoMessageToUser("Criado com Sucesso");
            load();
            reset();
            return "associadoRelat.xhtml";
        } catch (Exception e) {
//			keepDialogOpen();
            displayErrorMessageToUser("Ops, n�o foi possivel criar. Tente mais tarde");
            e.printStackTrace();
            return null;
        }
    }

    public void persisteTelefones() {
        TelefoneFacade tf = new TelefoneFacade();
        TelefoneDoAssociadoFacade tdaf = new TelefoneDoAssociadoFacade();

        for (TelefoneDoAssociado tda : associado.getTelefoneDoAssociados()) {

            if (tda.getTelefone().getId() == 0) {
                tf.createTelefone(tda.getTelefone());
            } else {
                tf.updateTelefone(tda.getTelefone());
            }
            if (tda.getId() == 0) {
                tdaf.createTelefoneDoAssociado(tda);
            } else {
                tdaf.updateTelefoneDoAssociado(tda);
            }
        }


    }

    public String update() {
        try {
            getFacade().updateAssociado(associado);
            persisteTelefones();
//			closeDialog();
            displayInfoMessageToUser("Atualizado com Sucesso");
            load();
            reset();
            return "associadoRelat.xhtml";
        } catch (Exception e) {
            //keepDialogOpen();
            displayErrorMessageToUser("Ops, nao foi possivel atualizar. Tente mais tarde");
            e.printStackTrace();
            return null;
        }
    }

    public void delete() {
        try {

            getFacade().deleteAssociado(associado);
//			closeDialog();
            displayInfoMessageToUser("Excluido com Sucesso");
            load();
            reset();
        } catch (Exception e) {
            //keepDialogOpen();
            displayErrorMessageToUser("Ops, n�o foi possivel Excluir. Tente mais tarde");
            e.printStackTrace();
        }
    }

    public List<Associado> getAllAssociados() {
        if (associados == null) {
            load();
        }

        return associados;
    }

    private void load() {
        associados = getFacade().listAll();
    }

    public void reset() {
        this.setAssociadoTemp(associado);
        ELFlash.getFlash().put("associadoTemp", associado);
        associado = new Associado();
    }

    public String prepararAdicionar() {
        reset();
        return "associadoCad.xhtml";
    }

    public String prepararVisualizar(long id) {

        //associadoTemp = (Associado) ELFlash.getFlash().get("entity");
        associadoTemp = facade.findAssociado(id);
        ELFlash.getFlash().put("associadoTemp", associadoTemp);

        return "associadoRelat.xhtml";
    }

    public String prepararAlterar(long id) {
        associadoTemp = facade.findAssociado(id);
        ELFlash.getFlash().put("associado", associadoTemp);
        associado = associadoTemp;

        return "associadoCad.xhtml";
    }

    public String prepararRemover(long id) {
        associadoTemp = facade.findAssociado(id);
        ELFlash.getFlash().put("associado", associadoTemp);
        associado = associadoTemp;

        return "associados.xhtml";
    }

    public List<UF> getUfs() {
        List<UF> ufss = new ArrayList<UF>();
        for (UF uf : UF.values()) {
            ufss.add(uf);
        }
        return ufss;

    }

    public TelefoneMB getTelefoneMB() {
        return telefoneMB;
    }

    public void setTelefoneMB(TelefoneMB telefoneMB) {
        this.telefoneMB = telefoneMB;
    }

    public Associado getAssociadoTemp() {
        associadoTemp = (Associado) ELFlash.getFlash().get("associadoTemp");
        return associadoTemp;
    }

    public void setAssociadoTemp(Associado associadoTemp) {
        this.associadoTemp = associadoTemp;
    }

    public void addTelefone(Telefone telefone) {
        TelefoneDoAssociado tda = new TelefoneDoAssociado();
        tda.setAssociado(associado);
        tda.setTelefone(telefone);

        associado.getTelefoneDoAssociados().add(tda);
        telefoneMB.reset();



    }
    
    
    public void prepararAlterarTelefone(TelefoneDoAssociado tda) {
        telefoneMB.setTelefone(tda.getTelefone());
        
    }
    

//    public void removeTelefone(int index){
//       associado.getTelefoneDoAssociados().remove(index);
////        
////        for(TelefoneDoAssociado tda:associado.getTelefoneDoAssociados()){
////           if(tda.getTelefone() == telefone){
////               associado.getTelefoneDoAssociados().remove(tda);
////               break;
////           }
////       }
//        
//        
//    }
    public void removeTelefone(TelefoneDoAssociado tda) {

        if (tda.getId() == 0) { //se nao estiver persistido

            for (int i = 0; i < associado.getTelefoneDoAssociados().size(); i++) {
                TelefoneDoAssociado tda1 = associado.getTelefoneDoAssociados().get(i);
                if (tda1.getTelefone().getTelefone().equals(tda.getTelefone().getTelefone())) {
                    if (tda1.getTelefone().getTipoTelefone() == tda.getTelefone().getTipoTelefone()) {
                        associado.getTelefoneDoAssociados().remove(i);
                        return;
                    }
                }
            }


        } else {//se estiver persistido
            for (int i = 0; i < associado.getTelefoneDoAssociados().size(); i++) {
                TelefoneDoAssociado tda1 = associado.getTelefoneDoAssociados().get(i);
                if (tda1.getId() == tda.getId()) {
                    associado.getTelefoneDoAssociados().remove(i);
                    return;
                }
            }
        }
    }
}